{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 初始使用tensorflow进行图像识别"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:50.515650Z",
     "start_time": "2018-06-01T06:32:43.133728Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/anaconda2/envs/tensorflow/lib/python3.5/importlib/_bootstrap.py:222: RuntimeWarning: compiletime version 3.6 of module 'tensorflow.python.framework.fast_tensor_util' does not match runtime version 3.5\n",
      "  return f(*args, **kwds)\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "from tensorflow.examples.tutorials.mnist import input_data\n",
    "from matplotlib import pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "tf.logging.set_verbosity(tf.logging.INFO)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T05:39:48.304594Z",
     "start_time": "2018-06-01T04:55:17.674707Z"
    }
   },
   "source": [
    "使用tensorflow下载数据集会报连接超时，这里手动下载数据集，并放到指定目录下"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.075054Z",
     "start_time": "2018-06-01T06:32:50.518290Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Extracting /Users/guoxudong/Documents/Learning_materials/AI/input_data/train-images-idx3-ubyte.gz\n",
      "Extracting /Users/guoxudong/Documents/Learning_materials/AI/input_data/train-labels-idx1-ubyte.gz\n",
      "Extracting /Users/guoxudong/Documents/Learning_materials/AI/input_data/t10k-images-idx3-ubyte.gz\n",
      "Extracting /Users/guoxudong/Documents/Learning_materials/AI/input_data/t10k-labels-idx1-ubyte.gz\n",
      "(55000, 784)\n",
      "(55000, 10)\n",
      "(5000, 784)\n",
      "(5000, 10)\n",
      "(10000, 784)\n",
      "(10000, 10)\n"
     ]
    }
   ],
   "source": [
    "mnist = input_data.read_data_sets(\"/Users/guoxudong/Documents/Learning_materials/AI/input_data\", one_hot=True)\n",
    "\n",
    "print(mnist.train.images.shape)\n",
    "print(mnist.train.labels.shape)\n",
    "\n",
    "print(mnist.validation.images.shape)\n",
    "print(mnist.validation.labels.shape)\n",
    "\n",
    "print(mnist.test.images.shape)\n",
    "print(mnist.test.labels.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T05:49:40.128071Z",
     "start_time": "2018-06-01T05:49:40.123888Z"
    }
   },
   "source": [
    "可以看到images里面有数量不等的图片，每张图片是28x28长度的一个一维向量，\n",
    "所以用的时候需要先给它还原成28x28的二维图片。labels中则是图片对应的数字的值。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.695746Z",
     "start_time": "2018-06-01T06:32:51.077167Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8, 8))\n",
    "\n",
    "for idx in range(16):\n",
    "    plt.subplot(4, 4, idx + 1)\n",
    "    plt.axis('off')\n",
    "    plt.title('[{}]'.format(np.argmax(mnist.train.labels[idx])))\n",
    "    plt.imshow(mnist.train.images[idx].reshape((28, 28)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来，定义用于训练的网络，首先定义网络的输入。\n",
    "\n",
    "这里我们直接使用上面的数据作为输入，所以定义两个placeholder分别用于图像和lable数据，另外，定义一个bool类型的变量用于标识当前网络是否正在训练。\n",
    "\n",
    "为了让网络更高效的运行，多个数据会被组织成一个batch送入网络，两个placeholder的第一个维度就是batchsize，因为我们这里还没有确定batchsize，所以第一个维度留空。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.706044Z",
     "start_time": "2018-06-01T06:32:51.698913Z"
    },
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "x = tf.placeholder(\"float\", [None, 784], name='x')\n",
    "y = tf.placeholder(\"float\", [None, 10], name='y')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "因为我们输入的是图片展开后的一维向量，所以第一步就需要先把一维向量还原为二维的图片。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.719298Z",
     "start_time": "2018-06-01T06:32:51.707730Z"
    },
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "x_image = tf.reshape(x, [-1, 28, 28, 1])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:07:36.530623Z",
     "start_time": "2018-06-01T06:07:36.522665Z"
    }
   },
   "source": [
    "接下来，我们定义第一个卷积层，使用6个5X5的卷积核对输入数据进行卷积，\n",
    "padding方式选择valid，所以输出数据的宽高变为24x24,但是深度已经从原来的1变成了6。\n",
    "本层卷积的激活函数为relu。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.764292Z",
     "start_time": "2018-06-01T06:32:51.721295Z"
    },
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('conv1'):\n",
    "    C1 = tf.contrib.slim.conv2d(\n",
    "        x_image, 6, [5, 5], padding='VALID', activation_fn=tf.nn.relu)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来进行stride为2的最大池化，池化后，输出深度不变，但是长宽减半，所以输出变成了12x12,深度6."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.774112Z",
     "start_time": "2018-06-01T06:32:51.766784Z"
    },
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('pool1'):\n",
    "    S2 = tf.contrib.slim.max_pool2d(C1, [2, 2], stride=[2, 2], padding='VALID')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:10:16.678485Z",
     "start_time": "2018-06-01T06:10:16.671472Z"
    }
   },
   "source": [
    "接下来，我们定义第二个卷积层，使用16个5X5的卷积核对输入数据进行卷积，\n",
    "padding方式还是选择valid，输出8x8,深度为16，本层卷积的激活函数为relu。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.805912Z",
     "start_time": "2018-06-01T06:32:51.776959Z"
    },
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('conv2'):\n",
    "    C3 = tf.contrib.slim.conv2d(\n",
    "        S2, 16, [5, 5], padding='VALID', activation_fn=tf.nn.relu)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "再进行一次stride为2的最大池化，输出为4x4,深度16。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.814748Z",
     "start_time": "2018-06-01T06:32:51.807560Z"
    },
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('pool2'):\n",
    "    S4 = tf.contrib.slim.max_pool2d(C3, [2, 2], stride=[2, 2], padding='VALID')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "池化后的数据是3维的，这里做一个拉平的操作，将3维数据展开到1维，然后送入两层全连接，全连接隐层中神经元个数分别为120，84。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.856740Z",
     "start_time": "2018-06-01T06:32:51.817287Z"
    },
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('fc1'):\n",
    "    S4_flat = tf.contrib.slim.flatten(S4)\n",
    "    C5 = tf.contrib.slim.fully_connected(\n",
    "        S4_flat, 120, activation_fn=tf.nn.relu)\n",
    "\n",
    "with tf.name_scope('fc2'):\n",
    "    F6 = tf.contrib.slim.fully_connected(C5, 84, activation_fn=tf.nn.relu)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:17:39.880958Z",
     "start_time": "2018-06-01T06:17:39.869797Z"
    }
   },
   "source": [
    "###### 对特征添加一个0.6的dropout，以40%的概率丢弃特征中的某些数据，\n",
    "这样可以提高网络的推广能力，减少过拟合的可能性。\n",
    "\n",
    "需要注意的是，dropout仅在训练的时候使用，验证的时候，需要关闭dropout，\n",
    "所以验证时候的keep_prob是1.0。\n",
    "\n",
    "dropout的输出最终送入一个隐层为10的全连接层，这个全连接层即为最后的分类器。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.913419Z",
     "start_time": "2018-06-01T06:32:51.860766Z"
    },
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('dropout'):\n",
    "    keep_prob = tf.placeholder(name='keep_prob', dtype=tf.float32)\n",
    "    F6_drop = tf.nn.dropout(F6, keep_prob)\n",
    "\n",
    "with tf.name_scope('fc3'):\n",
    "    logits = tf.contrib.slim.fully_connected(F6_drop, 10, activation_fn=None)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来定义loss和用于优化网络的优化器。loss计算使用了sparse_softmax_cross_entropy_with_logits,\n",
    "这样做的好处是labels可以不用手动做one_hot省了一些麻烦。这里使用了sgd优化器，学习率为0.3。\n",
    "\n",
    ">试试看，增大减小学习率，换个优化器再进行训练会发生什么。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:52.084738Z",
     "start_time": "2018-06-01T06:32:51.915376Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From <ipython-input-12-a994a230d566>:2: softmax_cross_entropy_with_logits (from tensorflow.python.ops.nn_ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "\n",
      "Future major versions of TensorFlow will allow gradients to flow\n",
      "into the labels input on backprop by default.\n",
      "\n",
      "See tf.nn.softmax_cross_entropy_with_logits_v2.\n",
      "\n",
      "Conv/weights:0\n",
      "INFO:tensorflow:Summary name Conv/weights:0 is illegal; using Conv/weights_0 instead.\n",
      "Conv/biases:0\n",
      "INFO:tensorflow:Summary name Conv/biases:0 is illegal; using Conv/biases_0 instead.\n",
      "Conv_1/weights:0\n",
      "INFO:tensorflow:Summary name Conv_1/weights:0 is illegal; using Conv_1/weights_0 instead.\n",
      "Conv_1/biases:0\n",
      "INFO:tensorflow:Summary name Conv_1/biases:0 is illegal; using Conv_1/biases_0 instead.\n",
      "fully_connected/weights:0\n",
      "INFO:tensorflow:Summary name fully_connected/weights:0 is illegal; using fully_connected/weights_0 instead.\n",
      "fully_connected/biases:0\n",
      "INFO:tensorflow:Summary name fully_connected/biases:0 is illegal; using fully_connected/biases_0 instead.\n",
      "fully_connected_1/weights:0\n",
      "INFO:tensorflow:Summary name fully_connected_1/weights:0 is illegal; using fully_connected_1/weights_0 instead.\n",
      "fully_connected_1/biases:0\n",
      "INFO:tensorflow:Summary name fully_connected_1/biases:0 is illegal; using fully_connected_1/biases_0 instead.\n",
      "fully_connected_2/weights:0\n",
      "INFO:tensorflow:Summary name fully_connected_2/weights:0 is illegal; using fully_connected_2/weights_0 instead.\n",
      "fully_connected_2/biases:0\n",
      "INFO:tensorflow:Summary name fully_connected_2/biases:0 is illegal; using fully_connected_2/biases_0 instead.\n"
     ]
    }
   ],
   "source": [
    "cross_entropy_loss = tf.reduce_mean(\n",
    "    tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=y))\n",
    "\n",
    "l2_loss = tf.add_n([\n",
    "    tf.nn.l2_loss(w)\n",
    "    for w in tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES)\n",
    "])\n",
    "\n",
    "for w in tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES):\n",
    "    print(w.name)\n",
    "    tf.summary.histogram(w.name, w)\n",
    "    \n",
    "total_loss = cross_entropy_loss + 7e-5 * l2_loss\n",
    "tf.summary.scalar('cross_entropy_loss', cross_entropy_loss)\n",
    "tf.summary.scalar('l2_loss', l2_loss)\n",
    "tf.summary.scalar('total_loss', total_loss)\n",
    "\n",
    "optimizer = tf.train.GradientDescentOptimizer(\n",
    "    learning_rate=0.3).minimize(total_loss)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:25:56.449132Z",
     "start_time": "2018-06-01T06:25:56.438340Z"
    }
   },
   "source": [
    "需要注意的是，上面的网络，最后输出的是未经softmax的原始logits，而不是概率分布，\n",
    "要想看到概率分布，还需要做一下softmax。\n",
    "\n",
    "将输出的结果与正确结果进行对比，即可得到我们的网络输出结果的准确率。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:39:50.010829Z",
     "start_time": "2018-06-01T06:39:49.997501Z"
    }
   },
   "outputs": [],
   "source": [
    "pred = tf.nn.softmax(logits)\n",
    "correct_pred = tf.equal(tf.argmax(y, 1), tf.argmax(logits, 1))\n",
    "accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "saver用于保存或恢复训练的模型。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:52.127795Z",
     "start_time": "2018-06-01T06:32:52.103115Z"
    },
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "batch_size = 100\n",
    "trainig_step = 1100\n",
    "\n",
    "saver = tf.train.Saver()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "以上定义的所有操作，均为计算图，也就是仅仅是定义了网络的结构，实际需要运行的话，还需要创建一个session，并将数据填入网络中。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:35:22.270272Z",
     "start_time": "2018-06-01T06:33:18.829198Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "after 100 training steps, the loss is 0.419134, the validation accuracy is 0.869\n",
      "after 200 training steps, the loss is 0.169971, the validation accuracy is 0.9348\n",
      "after 300 training steps, the loss is 0.163769, the validation accuracy is 0.9652\n",
      "after 400 training steps, the loss is 0.199261, the validation accuracy is 0.9668\n",
      "after 500 training steps, the loss is 0.0704892, the validation accuracy is 0.9758\n",
      "after 600 training steps, the loss is 0.0516179, the validation accuracy is 0.975\n",
      "after 700 training steps, the loss is 0.109255, the validation accuracy is 0.9742\n",
      "after 800 training steps, the loss is 0.0746088, the validation accuracy is 0.9796\n",
      "after 900 training steps, the loss is 0.0984972, the validation accuracy is 0.9794\n",
      "after 1000 training steps, the loss is 0.054732, the validation accuracy is 0.979\n",
      "the training is finish!\n",
      "the test accuarcy is: 0.9811\n"
     ]
    }
   ],
   "source": [
    "merged = tf.summary.merge_all()\n",
    "with tf.Session() as sess:\n",
    "\n",
    "    writer = tf.summary.FileWriter(\"logs/\", sess.graph)\n",
    "\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "\n",
    "    #定义验证集与测试集\n",
    "    validate_data = {\n",
    "        x: mnist.validation.images,\n",
    "        y: mnist.validation.labels,\n",
    "        keep_prob: 1.0\n",
    "    }\n",
    "    test_data = {x: mnist.test.images, y: mnist.test.labels, keep_prob: 1.0}\n",
    "\n",
    "    for i in range(trainig_step):\n",
    "        xs, ys = mnist.train.next_batch(batch_size)\n",
    "        _, loss, rs = sess.run(\n",
    "            [optimizer, cross_entropy_loss, merged],\n",
    "            feed_dict={\n",
    "                x: xs,\n",
    "                y: ys,\n",
    "                keep_prob: 0.6\n",
    "            })\n",
    "        writer.add_summary(rs, i)\n",
    "\n",
    "        #每100次训练打印一次损失值与验证准确率\n",
    "        if i > 0 and i % 100 == 0:\n",
    "            validate_accuracy = sess.run(accuracy, feed_dict=validate_data)\n",
    "            print(\n",
    "                \"after %d training steps, the loss is %g, the validation accuracy is %g\"\n",
    "                % (i, loss, validate_accuracy))\n",
    "            saver.save(sess, './model.ckpt', global_step=i)\n",
    "\n",
    "    print(\"the training is finish!\")\n",
    "    #最终的测试准确率\n",
    "    acc = sess.run(accuracy, feed_dict=test_data)\n",
    "    print(\"the test accuarcy is:\", acc)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:58:16.766415Z",
     "start_time": "2018-06-01T06:58:15.918700Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "INFO:tensorflow:Restoring parameters from ./model.ckpt-1000\n",
      "1.0\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nT9gIExERefL/G0bcF+hPXbMAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    ckpt = tf.train.get_checkpoint_state('./')\n",
    "    if ckpt and ckpt.model_checkpoint_path:\n",
    "        saver.restore(sess, ckpt.model_checkpoint_path)\n",
    "        final_pred, acc = sess.run(\n",
    "            [pred, accuracy],\n",
    "            feed_dict={\n",
    "                x: mnist.test.images[:16],\n",
    "                y: mnist.test.labels[:16],\n",
    "                keep_prob: 1.0\n",
    "            })\n",
    "        orders = np.argsort(final_pred)\n",
    "        plt.figure(figsize=(8, 8))\n",
    "        print(acc)\n",
    "        for idx in range(16):\n",
    "            order = orders[idx, :][-1]\n",
    "            prob = final_pred[idx, :][order]\n",
    "            plt.subplot(4, 4, idx + 1)\n",
    "            plt.axis('off')\n",
    "            plt.title('{}: [{}]-[{:.1f}%]'.format(\n",
    "                np.argmax(mnist.test.labels[idx]), order, prob * 100))\n",
    "            plt.imshow(mnist.test.images[idx].reshape((28, 28)))\n",
    "\n",
    "    else:\n",
    "        pass"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.4"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
